Generally, prior to designing any software product or application, the requirements of its users are captured. For this, the requirements are defined in a requirements specification, prepared typically by a requirement analyst. The requirement analyst is responsible for identifying the requirements after interaction with the users and other stakeholders. To understand the requirements of the users and to, subsequently, concretize the requirements, knowledge of the domain to which the software is related, i.e., domain knowledge, is required. For example, if the software is being developed for an insurance company, it is desired that the requirement analyst has access to knowledge about insurance norms and practices. The requirement analyst generally obtains the requisite domain knowledge from a domain expert. However, the services of the domain expert are usually very expensive and add to the overall cost of developing the software.
In general, the teams including the requirement analyst and programmers, who capture the user requirements and develop the application are geographically distributed and do not have a common business language to efficiently and effectively interact with each other. Further, since the teams are geographically distributed, the availability of the domain expert cannot be ensured at all times and for each and every team.
Further, in traditional software development methodologies, a rigid structure is followed throughout the software development lifecycle. Everything, from the requirements specification to the final delivery and maintenance, is documented in the beginning itself and strictly followed. Therefore, modifications, which may be required due to change in requirements, for example, changed user preferences, become difficult to implement, both in terms of cost and complexity.
Agile software development methodologies, on the other hand, involve rapid software development with shorter development lifecycle and greater collaboration between various stakeholders. The shorter development life cycle is ensured by developing an application in various logical and coherent units of functionalities, also referred to as iterations.